package net.suplementos.dao;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import javax.persistence.PersistenceContext;
import javax.persistence.PersistenceException;

import net.suplementos.exception.DAOException;

public final class SuplementosDAOFactory {

    @PersistenceContext(unitName = "SuplementosNet")
    private EntityManager manager;

	private EntityManagerFactory emf;

	private static SuplementosDAOFactory instancia;

	private SuplementosDAOFactory() throws DAOException {
        try {
            emf = Persistence.createEntityManagerFactory("SuplementosNet");
            manager = emf.createEntityManager();
        } catch (PersistenceException e) {
            throw new DAOException(e.getMessage(), e);
        }
	}

	public static final SuplementosDAOFactory getInstance() throws DAOException {
		if (instancia == null) {
			instancia = new SuplementosDAOFactory();
		}
		return instancia;
	}

    private EntityManager getEntityManager() {
    	return manager;
    }
	
	public ProdutoDAO getProdutoDAO() throws DAOException {
		return new ProdutoDAO(getEntityManager());
	}
	
	public PromocaoDAO getPromocaoDAO() throws DAOException {
		return new PromocaoDAO(getEntityManager());
	}

	public BaixaProdutoDAO getBaixaProdutoDAO() throws DAOException {
		return new BaixaProdutoDAO(getEntityManager());
	}

	public ClienteDAO getClienteDAO() throws DAOException {
		return new ClienteDAO(getEntityManager());
	}

	public EstoqueDAO getEstoqueDAO() throws DAOException {
		return new EstoqueDAO(getEntityManager());
	}

	public FornecedorDAO getFornecedorDAO() throws DAOException {
		return new FornecedorDAO(getEntityManager());
	}

	public LoteDAO getLoteDAO() throws DAOException {
		return new LoteDAO(getEntityManager());
	}

	public AtendimentoDAO getAtendimentoDAO() throws DAOException {
		return new AtendimentoDAO(getEntityManager());
	}

	public DespesaDAO getDespesaDAO() throws DAOException {
		return new DespesaDAO(getEntityManager());
	}

	public EstornoDAO getEstornoDAO() throws DAOException {
		return new EstornoDAO(getEntityManager());
	}

	public ProdutoAtendimentoDAO getProdutoAtendimentoDAO() throws DAOException {
		return new ProdutoAtendimentoDAO(getEntityManager());
	}

	public VendaDAO getVendaDAO() throws DAOException {
		return new VendaDAO(getEntityManager());
	}

	public VendaFormaPagamentoDAO getVendaFormaPagamentoDAO() throws DAOException {
		return new VendaFormaPagamentoDAO(getEntityManager());
	}

	public CategoriaDAO getCategoriaDAO() throws DAOException {
		return new CategoriaDAO(getEntityManager());
	}

	public FormaPagamentoDAO getFormaPagamentoDAO() throws DAOException {
		return new FormaPagamentoDAO(getEntityManager());
	}

	public FuncionalidadeDAO getFuncionalidadeDAO() throws DAOException {
		return new FuncionalidadeDAO(getEntityManager());
	}

	public MarcaDAO getMarcaDAO() throws DAOException {
		return new MarcaDAO(getEntityManager());
	}

	public ParametroSistemaDAO getParametroSistemaDAO() throws DAOException {
		return new ParametroSistemaDAO(getEntityManager());
	}

	public PerfilDAO getPerfilDAO() throws DAOException {
		return new PerfilDAO(getEntityManager());
	}

	public UsuarioDAO getUsuarioDAO() throws DAOException {
		return new UsuarioDAO(getEntityManager());
	}

	public UsuarioPerfilDAO getUsuarioPerfilDAO() throws DAOException {
		return new UsuarioPerfilDAO(getEntityManager());
	}

	public ArquivoDAO getArquivoDAO() throws DAOException {
		return new ArquivoDAO(getEntityManager());
	}
}
